package dp.subsequence;

/**
 * 给你一个整数数组 nums ，请你找出数组中乘积最大的连续子数组（该子数组中至少包含一个数字），并返回该子数组所对应的乘积。
 *
 *  
 *
 * 示例 1:
 *
 * 输入: [2,3,-2,4]
 * 输出: 6
 * 解释: 子数组 [2,3] 有最大乘积 6。
 * 示例 2:
 *
 * 输入: [-2,0,-1]
 * 输出: 0
 * 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
 *
 */
public class leetCode152_maxProduct {

    // dp[i] 表示下标为i时的，最大连续乘积为dp[i]
    public int maxProduct2(int[] nums) {
        if(nums == null || nums.length == 0) return 0;
        int[] dpMax = new int[nums.length];
        int[] dpMin = new int[nums.length];
        dpMax[0] = nums[0];
        dpMin[0] = nums[0];
        int max = nums[0];
        for (int i = 1; i < nums.length; i++) {
            dpMax[i] = Math.max(Math.max(dpMax[i - 1] * nums[i],nums[i]),nums[i] * dpMin[i - 1]);
            dpMin[i] = Math.min(Math.min(dpMin[i - 1] * nums[i],nums[i]),nums[i] * dpMax[i - 1]);
            max = Math.max(max,dpMax[i]);
        }

        return max;

    }

}
